<!DOCTYPE html>
<html lang="en">
  <head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"/>
 
<link rel="stylesheet" href="../assets/css/style.css"/> 
<!-- Copyright 1998-2021 by Northwoods Software Corporation. -->    <title> GoJS Brushes -- Northwoods Software </title>
    <link rel="stylesheet" href="../assets/css/prism.css"  />
  </head>
  <script>
    
    window.diagrams = [];
    window.goCode = function(pre, w, h, parentid, animation) {
      window.diagrams.push([pre, w, h, parentid, animation]);
    }
  </script>
  <body>
  <nav id="navTop" class="w-full z-30 top-0 text-white bg-nwoods-primary">
    <div class="w-full container max-w-screen-lg mx-auto flex flex-wrap sm:flex-nowrap items-center justify-between mt-0 py-2">
      <div class="md:pl-4">
        <a class="text-white hover:text-white no-underline hover:no-underline
        font-bold text-2xl lg:text-4xl rounded-lg hover:bg-nwoods-secondary " href="../">
          <h1 class="mb-0 p-1 ">GoJS</h1>
        </a>
      </div>
      <button id="topnavButton" class="rounded-lg sm:hidden focus:outline-none focus:ring" aria-label="Navigation">
        <svg fill="currentColor" viewBox="0 0 20 20" class="w-6 h-6">
          <path id="topnavOpen" fill-rule="evenodd" d="M3 5a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM9 15a1 1 0 011-1h6a1 1 0 110 2h-6a1 1 0 01-1-1z" clip-rule="evenodd"></path>
          <path id="topnavClosed" class="hidden" fill-rule="evenodd" d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" clip-rule="evenodd"></path>
        </svg>
      </button>
      <div id="topnavList" class="hidden lg:text-base sm:block items-center w-auto mt-0 text-white p-0 z-20">
        <ul class="list-reset list-none font-semibold flex justify-end flex-wrap sm:flex-nowrap items-center px-0 pb-0">
          <li class="p-1 sm:p-0"><a class="topnav-link" href="../learn/">Learn</a></li>
          <li class="p-1 sm:p-0"><a class="topnav-link" href="../samples/">Samples</a></li>
          <li class="p-1 sm:p-0"><a class="topnav-link" href="../intro/">Intro</a></li>
          <li class="p-1 sm:p-0"><a class="topnav-link" href="../api/">API</a></li>
          <li class="p-1 sm:p-0"><a class="topnav-link" href="https://www.nwoods.com/products/register.html">Register</a></li>
          <li class="p-1 sm:p-0"><a class="topnav-link" href="../download.html">Download</a></li>
          <li class="p-1 sm:p-0"><a class="topnav-link" href="https://forum.nwoods.com/c/gojs/11">Forum</a></li>
          <li class="p-1 sm:p-0"><a class="topnav-link" href="https://www.nwoods.com/contact.html"
           target="_blank" rel="noopener" onclick="getOutboundLink('https://www.nwoods.com/contact.html', 'contact');">Contact</a></li>
          <li class="p-1 sm:p-0"><a class="topnav-link" href="https://www.nwoods.com/sales/index.html"
           target="_blank" rel="noopener" onclick="getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy');">Buy</a></li>
        </ul>
      </div>
    </div>
    <hr class="border-b border-gray-600 opacity-50 my-0 py-0" />
  </nav>
    
    <div class="md:flex flex-col md:flex-row md:min-h-screen w-full max-w-screen-xl mx-auto">
      
    <div id="navSide" class="flex flex-col w-full md:w-40 lg:w-48 text-gray-700 bg-white flex-shrink-0">
      <div class="flex-shrink-0 px-8 py-4">
        <button id="navButton" class="rounded-lg md:hidden focus:outline-none focus:ring" aria-label="Navigation">
          <svg fill="currentColor" viewBox="0 0 20 20" class="w-6 h-6">
            <path id="navOpen" fill-rule="evenodd" d="M3 5a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM9 15a1 1 0 011-1h6a1 1 0 110 2h-6a1 1 0 01-1-1z" clip-rule="evenodd"></path>
            <path id="navClosed" class="hidden" fill-rule="evenodd" d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" clip-rule="evenodd"></path>
          </svg>
        </button>
      </div>
      <nav id="navList" class="min-h-screen hidden md:block sidebar-nav flex-grow px-1 lg:px-4 pb-4 md:pb-0 md:overflow-y-auto break-words">
  <a href="index.html">Basics</a>
  <a href="buildingObjects.html">Building Parts</a>
  <a href="usingModels.html">Using Models</a>
  <a href="dataBinding.html">Data Binding</a>
  <a href="react.html">GoJS with React</a>
  <a href="angular.html">GoJS with Angular</a>
  <a href="textBlocks.html">TextBlocks</a>
  <a href="shapes.html">Shapes</a>
  <a href="pictures.html">Pictures</a>
  <a href="panels.html">Panels</a>
  <a href="tablePanels.html">Table Panels</a>
  <a href="brush.html">Brushes</a>
  <a href="sizing.html">Sizing Objects</a>
  <a href="itemArrays.html">Item Arrays</a>
  <a href="changedEvents.html">Changed Events</a>
  <a href="transactions.html">Transactions</a>
  <a href="viewport.html">Coordinates</a>
  <a href="initialView.html">Initial View</a>
  <a href="collections.html">Collections</a>
  <a href="links.html">Links</a>
  <a href="linkLabels.html">Link Labels</a>
  <a href="connectionPoints.html">Link Points</a>
  <a href="ports.html">Ports</a>
  <a href="nodes.html">Nodes</a>
  <a href="debugging.html">Debugging</a>
  <a href="layouts.html">Layouts</a>
  <a href="trees.html">Trees</a>
  <a href="subtrees.html">SubTrees</a>
  <a href="groups.html">Groups</a>
  <a href="subgraphs.html">SubGraphs</a>
  <a href="sizedGroups.html">Sized Groups</a>
  <a href="selection.html">Selection</a>
  <a href="highlighting.html">Highlighting</a>
  <a href="animation.html">Animation</a>
  <a href="toolTips.html">ToolTips</a>
  <a href="contextmenus.html">Context Menus</a>
  <a href="events.html">Diagram Events</a>
  <a href="tools.html">Tools</a>
  <a href="commands.html">Commands</a>
  <a href="permissions.html">Permissions</a>
  <a href="validation.html">Validation</a>
  <a href="HTMLInteraction.html">HTML Interaction</a>
  <a href="layers.html">Layers &amp; Z-ordering</a>
  <a href="palette.html">Palette</a>
  <a href="overview.html">Overview</a>
  <a href="resizing.html">Resizing Diagrams</a>
  <a href="replacingDeleting.html">Replacing and Deleting</a>
  <a href="buttons.html">Buttons</a>
  <a href="templateMaps.html">Template Maps</a>
  <a href="legends.html">Legends and Titles</a>
  <a href="extensions.html">Extensions</a>
  <a href="geometry.html">Geometry Strings</a>
  <a href="grids.html">Grid Patterns</a>
  <a href="graduatedPanels.html">Graduated Panels</a>
  <a href="makingImages.html">Diagram Images</a>
  <a href="makingSVG.html">Diagram SVG</a>
  <a href="printing.html">Printing</a>
  <a href="serverSideImages.html">Server-side Images</a>
  <a href="nodeScript.html">GoJS in Node.js</a>
  <a href="testing.html">Testing</a>
  <a href="storage.html">Storage</a>
  <a href="performance.html">Performance</a>
  <a href="source.html">Building from Source</a>
  <a href="platforms.html">Platforms</a>
  <a href="deployment.html">Deployment</a>
      </nav>
    </div>      
      <div class="pt-4 px-2 md:px-0 lg:px-4 pb-16 w-full overflow-hidden">

<h1>GoJS Brushes</h1>
<p>
A <a>Brush</a> holds color information and describes how to draw the inside of a Shape or the stroke of a shape or a TextBlock or the background of any GraphObject.
<p>
A Brush must not be modified once it has been assigned to a GraphObject, such as the <a>Shape.fill</a> or <a>TextBlock.stroke</a> or <a>GraphObject.background</a>. However, a Brush may be shared by multiple GraphObjects.


<h2 id="SolidBrushes">Solid Brushes</h2>

The simplest brushes are defined by a single solid color. Because they are so simple, anywhere you want a single-color brush you can subsitute a valid CSS color string.

<pre class="lang-js" id="simpleBrushes"><code>
  diagram.add($(go.Part,
      $(go.Shape, "Circle", {
        fill: $(go.Brush, { color: "palegreen" })
      })
    ));

  diagram.add($(go.Part,
      $(go.Shape, "Circle", {
        fill: "palegreen"
      })
    ));
</code></pre>
<script>goCode("simpleBrushes", 600, 120)</script>

<p>Many CSS color strings are valid, including named colors, hex values, RGB values, and RGBA values.

<pre class="lang-js" id="simpleBrushes2"><code>
  diagram.layout = $(go.GridLayout);

  diagram.add($(go.Part,
      $(go.Shape, "Circle", {
        fill: "#DFAD83"
      })
    ));

  diagram.add($(go.Part,
      $(go.Shape, "Circle", {
        fill: "rgba(0,255,0,.3)" // semi transparent green
      })
    ));

  diagram.add($(go.Part,
      $(go.Shape, "Circle", {
        fill: "rgba(0,255,0,.3)",
        stroke: '#DFBB00',
        strokeWidth: 4,
        background: 'coral'
      })
    ));
</code></pre>
<script>goCode("simpleBrushes2", 600, 120)</script>


<h2 id="GradientBrushes">Gradient Brushes</h2>

<p>Gradient brushes are defined by setting the type and adding a number of color stops to the Brush.</p>
<pre class="lang-js"><code>
  // constructs a Linear gradient brush
  var brush = new go.Brush(go.Brush.Linear);
  brush.addColorStop(0, "blue");
  brush.addColorStop(1, "red");
</code></pre>

<p>To simplify the syntax, you can use go.GraphObject.make (see <a href="buildingObjects.html">building objects</a>):
<pre class="lang-js"><code>
  // constructs the same Brush
  var brush = $(go.Brush, "Linear", { 0.0: "blue", 1.0: "red" });
</code></pre>

<p>Some examples follow:</p>

<pre class="lang-js" id="gradients1"><code>
  diagram.add(
    $(go.Part, "Table",
      $(go.Shape, { row: 0, column: 0,
                    figure: "Circle", width: 100, height: 100, margin: 5,
                    // A linear gradient brush from blue to red, going from top to bottom (default)
                    fill: $(go.Brush, "Linear", { 0.0: "blue", 1.0: "red" })
                  }),

      $(go.Shape, { row: 0, column: 1,
                    figure: "Circle", width: 100, height: 100, margin: 5,
                    // A linear gradient brush from blue to red, going from bottom to top
                    // by defining start and end spots
                    fill: $(go.Brush, "Linear", { 0.0: "blue", 1.0: "red", start: go.Spot.Bottom, end: go.Spot.Top })
                  })
    ));
</code></pre>
<script>goCode("gradients1", 600, 120)</script>

<p>Brushes can have any number of color stops:</p>

<pre class="lang-js" id="gradients2"><code>
  diagram.add(
    $(go.Part, "Table",
      $(go.Shape, { row: 0, column: 0,
                    figure: "Rectangle", width: 100, height: 100, margin: 5,
                    // A rainbow linear gradient brush:
                    fill: $(go.Brush, "Linear", {
                      0.0: "rgba(255, 0, 0, 1)",
                      0.15: "rgba(255, 255, 0, 1)",
                      0.30: "rgba(0, 255, 0, 1)",
                      0.50: "rgba(0, 255, 255, 1)",
                      0.65: "rgba(0, 0, 255, 1)",
                      0.80: "rgba(255, 0, 255, 1)",
                      1: "rgba(255, 0, 0, 1)"
                    })
                  }),

      $(go.Shape, { row: 0, column: 1,
                    figure: "Rectangle", width: 100, height: 100, margin: 5,
                    // A rainbow radial gradient brush:
                    fill: $(go.Brush, "Radial", {
                      0.0: "rgba(255, 0, 0, 1)",
                      0.15: "rgba(255, 255, 0, 1)",
                      0.30: "rgba(0, 255, 0, 1)",
                      0.50: "rgba(0, 255, 255, 1)",
                      0.65: "rgba(0, 0, 255, 1)",
                      0.80: "rgba(255, 0, 255, 1)",
                      1: "rgba(255, 0, 0, 1)"
                    })
                  })
    ));
</code></pre>
<script>goCode("gradients2", 600, 120)</script>

<p>Radial gradient brushes can be controlled with <a>Brsuh.startRadius</a> and <a>Brush.endRadius</a>, which default to zero and NaN, respectively, meaning the gradient begins at the very center and goes to the farthest measured edge of the object.

<pre class="lang-js" id="gradients21"><code>
  diagram.layout = $(go.GridLayout);

  diagram.add(
    $(go.Part,
      $(go.Shape, {
                    figure: "Rectangle", width: 100, height: 100, margin: 5,
                    // A rainbow radial gradient brush:
                    fill: $(go.Brush, "Radial", {
                      0.0: "red", 1: "black"
                    })
                  })
    ));

  diagram.add(
    $(go.Part,
      $(go.Shape, {
                    figure: "Rectangle", width: 100, height: 100, margin: 5,
                    // A rainbow radial gradient brush:
                    fill: $(go.Brush, "Radial", {
                      startRadius: 30, 0.0: "red", 1: "black"
                    })
                  })
    ));

  diagram.add(
    $(go.Part,
      $(go.Shape, {
                    figure: "Rectangle", width: 100, height: 100, margin: 5,
                    // A rainbow radial gradient brush:
                    fill: $(go.Brush, "Radial", {
                      startRadius: 30, endRadius: 40, 0.0: "red", 1: "black"
                    })
                  })
    ));
</code></pre>
<script>goCode("gradients21", 600, 120)</script>



<p>Several GraphObjects can share the same Brush:

<pre class="lang-js" id="gradients3"><code>

  diagram.layout = $(go.GridLayout);

  // Create one brush for several GraphObjects to share:
  var rainbow = $(go.Brush, "Linear", {
                        0.0: "rgba(255, 0, 0, 1)",
                        0.15: "rgba(255, 255, 0, 1)",
                        0.30: "rgba(0, 255, 0, 1)",
                        0.50: "rgba(0, 255, 255, 1)",
                        0.65: "rgba(0, 0, 255, 1)",
                        0.80: "rgba(255, 0, 255, 1)",
                        1: "rgba(255, 0, 0, 1)"
                      });
  diagram.add(
    $(go.Part,
      $(go.Shape, { figure: "Rectangle", width: 100, height: 100, fill: rainbow })
    ));

  diagram.add(
    $(go.Part,
      $(go.Shape, { figure: "Fragile", width: 50, height: 50, angle: 45, fill: rainbow })
    ));


  diagram.add(
    $(go.Part, "Auto",
      $(go.Shape, { figure: "Rectangle", fill: rainbow }),
      $(go.TextBlock, "text", { font: 'bold 32pt sans-serif', stroke: rainbow, angle: 90 })
    ));

  diagram.add(
    $(go.Part,
      $(go.Shape, { figure: "Circle", width: 70, height: 70, angle: 180, fill: null, strokeWidth: 10, stroke: rainbow })
    ));

</code></pre>


<script>goCode("gradients3", 600, 120)</script>


<h2 id="PatternBrushes">Pattern Brushes</h2>
<p>The following example sets up two Pattern brushes, one using an HTML Canvas with content drawn to it, which looks like this:
<div id="patternCanvas"></div>
<script type="text/javascript">
  // set up an 40x40 HTML Canvas and draw on it to create a repeating "tile" to use as a pattern
    var patternCanvas = document.createElement('canvas');
    patternCanvas.width = 40;
    patternCanvas.height = 40;
    var pctx = patternCanvas.getContext('2d');

    // This creates a shape similar to a diamond leaf
    pctx.beginPath();
    pctx.moveTo(0.0, 40.0);
    pctx.lineTo(26.9, 36.0);
    pctx.bezierCurveTo(31.7, 36.0, 36.0, 32.1, 36.0, 27.3);
    pctx.lineTo(40.0, 0.0);
    pctx.lineTo(11.8, 3.0);
    pctx.bezierCurveTo(7.0, 3.0, 3.0, 6.9, 3.0, 11.7);
    pctx.lineTo(0.0, 40.0);
    pctx.closePath();
    pctx.fillStyle = "rgb(188, 222, 178)";
    pctx.fill();
    pctx.lineWidth = 0.8;
    pctx.strokeStyle = "rgb(0, 156, 86)";
    pctx.lineJoin = "miter";
    pctx.miterLimit = 4.0;
    pctx.stroke();

    document.getElementById('patternCanvas').appendChild(patternCanvas);
</script>

<p>The other Pattern Brush uses this image:</p>
<p><img src="images/pattern.jpg"/></p>

<pre class="lang-js" id="diagramPre"><code>

  // set up an 40x40 HTML Canvas and draw on it to create a repeating "tile" to use as a pattern
  function makePattern() {
    var patternCanvas = document.createElement('canvas');
    patternCanvas.width = 40;
    patternCanvas.height = 40;
    var pctx = patternCanvas.getContext('2d');

    // This creates a shape similar to a diamond leaf
    pctx.beginPath();
    pctx.moveTo(0.0, 40.0);
    pctx.lineTo(26.9, 36.0);
    pctx.bezierCurveTo(31.7, 36.0, 36.0, 32.1, 36.0, 27.3);
    pctx.lineTo(40.0, 0.0);
    pctx.lineTo(11.8, 3.0);
    pctx.bezierCurveTo(7.0, 3.0, 3.0, 6.9, 3.0, 11.7);
    pctx.lineTo(0.0, 40.0);
    pctx.closePath();
    pctx.fillStyle = "rgb(188, 222, 178)";
    pctx.fill();
    pctx.lineWidth = 0.8;
    pctx.strokeStyle = "rgb(0, 156, 86)";
    pctx.lineJoin = "miter";
    pctx.miterLimit = 4.0;
    pctx.stroke();

    return patternCanvas;
  }

  if (window.goSamples) goSamples();  // init for these samples -- you don't need to call this
  var $ = go.GraphObject.make;  // for conciseness in defining templates

  diagram.nodeTemplate =
    $(go.Node, "Spot",
      { resizable: true, resizeObjectName: 'SHAPE' },
      $(go.Shape, "Rectangle",
        { name: 'SHAPE', strokeWidth: 0, stroke: null },
        new go.Binding("fill")),
      $(go.TextBlock,
        { margin: 10, font: "bold 18px Verdana" },
        new go.Binding("text", "key"))
    );

  var img = new Image();
  img.src = 'images/pattern.jpg';

  // Use an image as a pattern
  var patternBrush = $(go.Brush, "Pattern", { pattern: img });
  // use a reference to an HTML Canvas (with renderings on it) as a pattern:
  var patternBrush2 = $(go.Brush, "Pattern", { pattern: makePattern() });


  diagram.model = new go.GraphLinksModel(
    [
      { key: "Alpha", fill: patternBrush },
      { key: "Beta",  fill: patternBrush2 }
    ],
    [
    ]);
</code></pre>
<div style="width:100%">
  <span id="diagramSpan" style="display: inline-block; vertical-align: top">
    <p><b>The result:</b></p>
  </span>
</div>
<script>goCode("diagramPre", 500, 300, "diagramSpan");</script>

<h2 id="BrushFunctions">Brush Functions</h2>
<p>
  There are some functions available for generating different colors or modifying Brush colors:
</p>
<ul>
  <li>
    <a>Brush,randomColor</a> - returns a random hexadecimal color value
  <li>
    <a>Brush,lightenBy</a> and <a>Brush,darkenBy</a> - return lightened or darkened colors/brushes; there are both instance
    and static versions
  </li>
  <li>
    <a>Brush,lighten</a> and <a>Brush,darken</a> - convenience static functions which return lightened or darkened colors
  </li>
  <li>
    <a>Brush,mix</a> - mixes two colors together
  </li>
  <li>
    <a>Brush,isDark</a> - determines whether a color is dark, often used in bindings; there are both instance and static versions
  </li>
</ul>
<p>
  In the following example, parts use the lighten and darken functions to get suitable colors for their stroke/fill.
</p>
<pre class="lang-js" id="functions"><code>
  diagram.layout = $(go.GridLayout);
  var color1 = "rgb(80, 130, 210)";
  var color2 = go.Brush.randomColor(192, 224);
  var gradBrush = $(go.Brush, "Linear", { 0: color1, 1: color2 });
  function shapeStyle() {
    return [ "Ellipse", { width: 120, height: 80, strokeWidth: 4 } ];
  }

  // static Brush methods
  diagram.add($(go.Part, "Auto",
      $(go.Shape, shapeStyle(),
        { fill: color1, stroke: go.Brush.darken(color1) }),
      $(go.TextBlock, "dark stroke")));

  diagram.add($(go.Part, "Auto",
      $(go.Shape, shapeStyle(),
        { fill: color1, stroke: go.Brush.darkenBy(color1, .4) }),
      $(go.TextBlock, "darker stroke")));

  diagram.add($(go.Part, "Auto",
      $(go.Shape, shapeStyle(),
        { fill: go.Brush.lighten(color1), stroke: color1 }),
      $(go.TextBlock, "light fill")));

  diagram.add($(go.Part, "Auto",
      $(go.Shape, shapeStyle(),
        { fill: go.Brush.lightenBy(color1, .4), stroke: color1 }),
      $(go.TextBlock, "lighter fill")));

  // instance Brush methods
  diagram.add($(go.Part, "Auto",
      $(go.Shape, shapeStyle(),
        { fill: gradBrush.copy().lightenBy(.2) }),
      $(go.TextBlock, "lighter")));

  diagram.add($(go.Part, "Auto",
      $(go.Shape, shapeStyle(),
        { fill: gradBrush }),
      $(go.TextBlock, "normal")));

  diagram.add($(go.Part, "Auto",
      $(go.Shape, shapeStyle(),
        { fill: gradBrush.copy().darkenBy(.2) }),
      $(go.TextBlock, "darker")));
</code></pre>
<script>goCode("functions", 600, 200)</script>
<p>
  In the following example, the color of text is determined by whether the background shape is dark.
</p>
<pre class="lang-js" id="functions2"><code>
  diagram.layout = $(go.GridLayout);

  diagram.nodeTemplate =
    $(go.Node, "Auto",
      { desiredSize: new go.Size(80, 40) },
      $(go.Shape, "RoundedRectangle", { strokeWidth: 0 },
        new go.Binding("fill", "color")),
      $(go.TextBlock, { margin: 8 },
        new go.Binding("stroke", "color",
              // dark nodes use white text, light nodes use dark text
              function (c) { return go.Brush.isDark(c) ? "white" : "black"; }),
        new go.Binding("text", "key")
      )
    );

  diagram.model = new go.Model(
    [
      { key: "Alpha", color: "white" },
      { key: "Beta", color: "black" },
      { key: "Gamma", color: "darkblue" },
      { key: "Delta", color: "lightblue" },
      { key: "Epsilon", color: "darkgreen" },
      { key: "Zeta", color: "lightgreen" },
      { key: "Eta", color: "darkred" },
      { key: "Theta", color: "lightcoral" }
    ]
  )
</code></pre>
<script>goCode("functions2", 600, 200)</script>

      </div>
    </div>
  
  <div class="bg-nwoods-primary">
    <section class="max-w-screen-lg text-white container mx-auto py-2 px-12">
      <p id="version" class="leading-none mb-2 my-4">GoJS</p>
    </section>
  </div><footer class="bg-nwoods-primary text-white">
  <div class="container max-w-screen-lg mx-auto  px-8">
    <div class="w-full py-6">

        <div class="max-w-screen-lg xl:max-w-screen-xl mx-auto px-4 sm:px-6 md:px-8">
          <ul class="text-sm font-medium pb-14 sm:pb-20 grid grid-cols-1 sm:grid-cols-3 gap-y-10">
            <li class="list-none row-span-2">
              <h2 class="text-base font-semibold tracking-wide">GoJS</h2>
              <ul class="list-none space-y-4 md:space-y-1 px-0">
                <li>
                  <a href="../samples/index.html">Samples</a>
                </li>
                <li>
                  <a href="../learn/index.html">Learn</a>
                </li>
                <li>
                  <a href="../intro/index.html">Intro</a>
                </li>
                <li>
                  <a href="../api/index.html">API</a>
                </li>
                <li>
                  <a href="../changelog.html">Changelog</a>
                </li>
                <li>
                  <a href="https://github.com/NorthwoodsSoftware/GoJS">GitHub</a>
                </li>
              </ul>
            </li>
            <li class="list-none row-span-2">
              <h2 class="text-base font-semibold tracking-wide">Support</h2>
              <ul class="list-none space-y-4 md:space-y-1 px-0">
                <li>
                  <a href="https://www.nwoods.com/contact.html"
                  target="_blank" rel="noopener" onclick="getOutboundLink('https://www.nwoods.com/contact.html', 'contact');">Contact</a>
                </li>
                <li>
                  <a href="https://forum.nwoods.com/c/gojs">Forum</a>
                </li>
                <li>
                  <a href="https://www.nwoods.com/app/activate.aspx?sku=gojs">Activate</a>
                </li>
                <li>
                  <a href="https://www.nwoods.com/sales/index.html"
                  target="_blank" rel="noopener" onclick="getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy');">Buy</a>
                </li>
                <li>
                  <a href="https://www.youtube.com/channel/UC9We8EoX596-6XFjJDtZIDg">Videos</a>
                </li>
              </ul>
            </li>
            <li class="list-none row-span-2">
              <h2 class="text-base font-semibold tracking-wide">Company</h2>
              <ul class="list-none space-y-4 md:space-y-1 px-0">
                <li>
                  <a href="https://www.nwoods.com">Northwoods</a>
                </li>
                <li>
                  <a href="https://www.nwoods.com/about.html">About Us</a>
                </li>
                <li>
                  <a href="https://www.nwoods.com/contact.html">Contact Us</a>
                </li>
                <li>
                  <a href="https://twitter.com/northwoodsgo">Twitter</a>
                </li>

              </ul>
            </li>
          </ul>


      <p class="text-sm text-gray-100 md:mb-6">
        Copyright 1998-2021 <a class="text-white" href="https://www.nwoods.com">Northwoods Software</a>
      </p>
    </div>
  </div>
</footer>  </body>

<script async src="https://www.googletagmanager.com/gtag/js?id=UA-1506307-5"></script> 
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date()); gtag('config', 'UA-1506307-5');
  var getOutboundLink = function(url, label) {
    gtag('event', 'click', {
      'event_category': 'outbound',
      'event_label': label,
      'transport_type': 'beacon'
    });
  }

  // topnav
  var topButton = document.getElementById("topnavButton");
  var topnavList = document.getElementById("topnavList");
  topButton.addEventListener("click", function() {
    this.classList.toggle("active");
    topnavList.classList.toggle("hidden");
    document.getElementById("topnavOpen").classList.toggle("hidden");
    document.getElementById("topnavClosed").classList.toggle("hidden");
  });
</script>
  <script src="../assets/js/prism.js"></script>
  <script src="../release/go.js"></script>
<script src="../extensions/Figures.js"></script>  <script src="../assets/js/goDoc.js"></script>
  <script>
    document.addEventListener("DOMContentLoaded", function() {
      if (window.go) document.getElementById('version').textContent = "GoJS version " + go.version;
      if (window.goDoc) window.goDoc();
      var d = window.diagrams;
      for (var i = 0; i < d.length; i++) {
        var dargs = d[i];
        goCodeExecute(dargs[0], dargs[1], dargs[2], dargs[3], dargs[4]);
      }
      if (window.extra) window.extra();
    });
  </script>
</html>
